/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package sys.dao;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import sys.bean.ProdutoBean;
import sys.utils.ConexaoADS;
import sys.utils.ConexaoMySql;
import static sys.utils.Utils.codCorreto;

/**
 *
 * @author Cesar Daniel
 */
public class ProdutoDao {

    /*
     dados do produto no MySQL
     */
    public ProdutoBean produtoMySQL(int idProduto) throws SQLException {

        Connection con = ConexaoMySql.getConection();

        String sql = "SELECT p.codigo, p.descricao, p.unidade, p.situacao\n"
                + "FROM produto p \n"
                + "WHERE p.codigo = "+idProduto;

        PreparedStatement stmt = con.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();

        ProdutoBean produto = new ProdutoBean();      
        while (rs.next()) {
            produto.setCodigo(rs.getString("codigo"));
            produto.setDescricao(rs.getString("descricao"));
            produto.setUn(rs.getString("unidade"));
            produto.setSituacao(rs.getString("situacao"));
        }
        stmt.close();
        con.close();
        return produto;
    }

    /*
     lista de produtos da concreteira
     */
    public static List<ProdutoBean> listaProdutosMySQL(String consulta) throws SQLException {
        List<ProdutoBean> lista = new ArrayList<>();

        Connection con = ConexaoMySql.getConection();

        String sql = "SELECT p.codigo, p.descricao, p.unidade, p.preco_custo, p.preco_venda \n"
                + "FROM produto p WHERE p.flag_concreteira = 'S' AND p.descricao LIKE '%" + consulta + "%'";

        PreparedStatement stm = con.prepareStatement(sql);
        ResultSet rs = stm.executeQuery();

        while (rs.next()) {
            ProdutoBean produto = new ProdutoBean();

            produto.setCodigo(rs.getString("codigo"));
            produto.setDescricao(rs.getString("descricao"));
            produto.setUn(rs.getString("unidade"));
            produto.setpCusto(rs.getDouble("preco_custo"));
            produto.setpVenda(rs.getDouble("preco_venda"));

            lista.add(produto);

        }
        stm.close();
        con.close();

        return lista;
    }

    /*
     lista de produtos para criar etiquetas
     */
    public static List<ProdutoBean> listaProdutosSpac(String txConsulta) throws SQLException, IOException {
        List<ProdutoBean> lista = new ArrayList<>();

        Connection con = ConexaoADS.getConection();

        String sql = "SELECT C01CODIGO, C01DESC, C01UNIDADE, C01CODBAR, C01PRCCUS, C01PRCVDA FROM SPAC01 " + txConsulta;

        PreparedStatement stm = con.prepareStatement(sql);
        ResultSet rs = stm.executeQuery();

        while (rs.next()) {
            ProdutoBean produto = new ProdutoBean();

            produto.setCodigo(rs.getString("C01CODIGO"));
            produto.setDescricao(rs.getString("C01DESC"));
            produto.setUn(rs.getString("C01UNIDADE"));
            produto.setCodigoBarras(rs.getString("C01CODBAR"));
            produto.setpCusto(rs.getDouble("C01PRCCUS"));
            produto.setpVenda(rs.getDouble("C01PRCVDA"));

            lista.add(produto);

        }
        stm.close();
        con.close();

        return lista;
    }

    /*
     inicio para utilizacao com analise de reajustes     
     lista para atualizar tabela de reajustes com dados da tabela SPAC175 onde é armazenado todos valores de custo/venda/margem na entrada de nota.
     */
    public static List<ProdutoBean> listaReajustesSpac(String dataInicial, String dataFinal) throws SQLException, IOException {
        List<ProdutoBean> lista = new ArrayList<>();
        Connection con = ConexaoADS.getConection();

        String sql = "SELECT C175DATA, C01DESC, C175CODPRO, ROUND(C175CSTANT,2) AS CUSTOANT, ROUND(C175CSTATU,2) AS CUSTOATU, "
                + "ROUND((((C175CSTATU*100)/C175CSTANT)-100),2) AS REAJCUSTO, C175VNDANT, C175VNDATU, "
                + "ROUND((((C175VNDATU*100)/C175VNDANT)-100),2) AS REAJVENDA "
                + "FROM SPAC01, SPAC175 "
                + "WHERE C175CODPRO = C01CODIGO  "
                + "AND C175DATA BETWEEN '" + dataInicial + "' AND '" + dataFinal + "' "
                + "AND C175CSTANT <> 0 "
                + "AND C175CSTATU <> 0 "
                + "AND C175VNDANT <> 0 "
                + "AND C175VNDATU <> 0 ";

        PreparedStatement stm = con.prepareStatement(sql);
        ResultSet rs = stm.executeQuery();

        while (rs.next()) {

            ProdutoBean produto = new ProdutoBean();

            produto.setDataAlteracao(rs.getString("C175DATA"));
            produto.setDescricao(rs.getString("C01DESC"));
            produto.setCodigo(rs.getString("C175CODPRO"));
            produto.setcAnterior(rs.getDouble("CUSTOANT"));
            produto.setcAtual(rs.getDouble("CUSTOATU"));
            produto.setReajusteCusto(rs.getDouble("REAJCUSTO"));
            produto.setvAnterior(rs.getDouble("C175VNDANT"));
            produto.setvAtual(rs.getDouble("C175VNDATU"));
            produto.setReajusteVenda(rs.getDouble("REAJVENDA"));
            produto.setTipo("ENTRADA");

            lista.add(produto);

        }

        stm.close();
        con.close();
        return lista;
    }

    /*
     Lista com novos produtos com base na data do cadastro no SPAC
     */
    public static List<ProdutoBean> novosProdutos(String dataInicial, String dataFinal) throws SQLException, IOException {

        List<ProdutoBean> lista = new ArrayList<>();
        Connection con = ConexaoADS.getConection();

        String sql = " SELECT C01CODBAR, C01DESC, C01PRCCUS, C01PRCVDA, C01DTCAD, "
                + "ROUND((((C01PRCVDA / C01PRCCUS)-1)*100),2) AS MARKUP "
                + "FROM SPAC01 "
                + "WHERE C01DTCAD BETWEEN '" + dataInicial + "' AND '" + dataFinal + "' "
                + "ORDER BY 5 DESC";

        PreparedStatement stm = con.prepareStatement(sql);
        ResultSet rs = stm.executeQuery();

        while (rs.next()) {

            ProdutoBean produto = new ProdutoBean();
            produto.setCodigoBarras(rs.getString("C01CODBAR"));
            produto.setDescricao(rs.getString("C01DESC"));
            produto.setpCusto(rs.getDouble("C01PRCCUS"));
            produto.setpVenda(rs.getDouble("C01PRCVDA"));
            produto.setDataCadastro(rs.getString("C01DTCAD"));
            produto.setMarkup(rs.getDouble("MARKUP"));

            lista.add(produto);

        }

        stm.close();
        con.close();
        return lista;
    }

    /*
     cadastrando produtos novos no mysql
     */
    public static void incluirProdutoNovo(ProdutoBean produto) throws SQLException {

        Connection con = ConexaoMySql.getConection();
        String sql = "INSERT INTO produto (codigo, descricao, unidade, situacao, venda_atual, custo_atual) VALUES (?, ?, ?, ?, ?, ?);";

        PreparedStatement stmt = con.prepareStatement(sql);

        stmt.setString(1, produto.getCodigo());
        stmt.setString(2, produto.getDescricao());
        stmt.setString(3, produto.getUn());
        stmt.setString(4, produto.getSituacao());
        stmt.setDouble(5, produto.getpVenda());
        stmt.setDouble(6, produto.getpCusto());

        stmt.execute();

        stmt.close();
        con.close();
    }

    /*
     listando os novos produtos para cadastrar no mysql
     */
    public static List<ProdutoBean> novosProdutosMysql() throws SQLException, IOException {
        List<ProdutoBean> lista = new ArrayList<>();
        Connection con = ConexaoADS.getConection();

        String sql = "SELECT C01CODIGO, C01DESC, C01UNIDADE, C01FLAG, C01PRCCUS, C01PRCVDA FROM SPAC01 WHERE C01CODIGO > '" + codCorreto(lastProduct(), 5) + "'";

        PreparedStatement stm = con.prepareStatement(sql);
        ResultSet rs = stm.executeQuery();

        while (rs.next()) {

            ProdutoBean produto = new ProdutoBean();
            produto.setCodigo(rs.getString("C01CODIGO"));
            produto.setDescricao(rs.getString("C01DESC"));
            produto.setUn(rs.getString("C01UNIDADE"));
            produto.setSituacao(rs.getString("C01FLAG"));
            produto.setpCusto(rs.getDouble("C01PRCCUS"));
            produto.setpVenda(rs.getDouble("C01PRCVDA"));

            lista.add(produto);

        }

        stm.close();
        con.close();
        return lista;
    }

    /*
     retornando a ultima data de coleta. Assim o sistema coleta apenas o que for depois dessa data.
     */
    public static String dateLastColeta() throws SQLException {
        Connection con = ConexaoMySql.getConection();
        String data = "";

        String sqlData = "SELECT DATE_FORMAT(MAX(alteracao.DATA_COLETA),'%Y%m%d')  AS DATA_COLETA FROM alteracao";
        PreparedStatement stmt = con.prepareStatement(sqlData);
        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {
            data = rs.getString("DATA_COLETA");
        }
        stmt.close();
        con.close();

        return data;

    }

    /*
     retornando o ultimo produto cadastrado no mysql
     */
    public static String lastProduct() throws SQLException {
        Connection con = ConexaoMySql.getConection();
        String lastCodigo = "";

        String sqlData = "SELECT MAX(produto.CODIGO) AS CODIGO FROM produto";
        PreparedStatement stmt = con.prepareStatement(sqlData);
        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {
            lastCodigo = rs.getString("CODIGO");
        }

        stmt.close();
        con.close();

        return lastCodigo;
    }

    /*
     Lista com os produtos reajustados pela entrada de notas. Obs. verifica pelo período, trazendo todos os produtos com entrada no período informado
     */
    public static List<ProdutoBean> reajusteEntrada() throws SQLException, IOException {

        List<ProdutoBean> lista = new ArrayList<>();
        Connection con = ConexaoADS.getConection();

        String sql = "SELECT C81PROD,C01PRCVDA,C01PRCCUS,C80DTSAI "
                + "FROM SPAC81, SPAC80, SPAC01 "
                + "WHERE C81NRNF = C80NRNF AND "
                + "C81PROD = C01CODIGO AND "
                + "C80DTSAI >= '" + dateLastColeta() + "'";

        PreparedStatement stm = con.prepareStatement(sql);
        ResultSet rs = stm.executeQuery();

        while (rs.next()) {

            ProdutoBean produto = new ProdutoBean();

            produto.setCodigo(rs.getString("C81PROD"));
            produto.setvAtual(rs.getDouble("C01PRCVDA"));
            produto.setcAtual(rs.getDouble("C01PRCCUS"));
            produto.setDataAlteracao(rs.getString("C80DTSAI"));
            produto.setTipo("ENTRADA");

            lista.add(produto);
        }

        stm.close();
        con.close();
        return lista;
    }

    /*
     Lista com produtos alterados manualmente pelo reajuste de preços no SPAC
     */
    public static List<ProdutoBean> reajusteManual() throws SQLException, IOException {
        List<ProdutoBean> lista = new ArrayList<>();
        Connection con = ConexaoADS.getConection();

        String sql = "SELECT C01CODIGO, C01PRCVDA, C01PRCCUS, C01DTREAJ "
                + "FROM SPAC01 "
                + "WHERE (C01DTREAJ >= '" + dateLastColeta() + "' OR C01ALTERA = 'S')";

        PreparedStatement stm = con.prepareStatement(sql);
        ResultSet rs = stm.executeQuery();

        while (rs.next()) {

            ProdutoBean produto = new ProdutoBean();

            produto.setCodigo(rs.getString("C01CODIGO"));
            produto.setvAtual(rs.getDouble("C01PRCVDA"));
            produto.setcAtual(rs.getDouble("C01PRCCUS"));
            if (!rs.getString("C01DTREAJ").equals("")) {
                produto.setDataAlteracao(rs.getString("C01DTREAJ"));
            }
            produto.setTipo("MANUAL");

            lista.add(produto);

        }

        stm.close();
        con.close();
        return lista;
    }

    public static void refreshAlterados(ProdutoBean produto) throws SQLException {

        Connection con = ConexaoMySql.getConection();

        double vendaAtual = 0;
        double custoAtual = 0;

        /*
         P.VENDA_ATUAL, P.CUSTO_ATUAL - Valores iguais o do SPAC (valores atuais)
         pegando esses valores para jogar como valor anterior após alteração.
         */
        String sqlValAnt = "SELECT P.VENDA_ATUAL, P.CUSTO_ATUAL FROM produto P WHERE P.CODIGO = " + produto.getCodigo();
        PreparedStatement stmValAnt = con.prepareStatement(sqlValAnt);
        ResultSet rs = stmValAnt.executeQuery();

        while (rs.next()) {
            vendaAtual = rs.getDouble("VENDA_ATUAL");
            custoAtual = rs.getDouble("CUSTO_ATUAL");
        }

        /*
         Preparando insert com novos valores do SPAC (venda/custo). VENDA_ANTERIOR, CUSTO_ANTERIOR recebem o valor atual do mysql, ou seja, vai ser o valor anterior
         */
        String sqlInsert = "INSERT INTO alteracao (CODIGO, DATA_ALTERACAO, NOVO_VENDA, NOVO_CUSTO, TIPO, VENDA_ANTERIOR, CUSTO_ANTERIOR, DATA_COLETA) VALUES (?,?,?,?,?,?,?,CURDATE());";
        PreparedStatement stm = con.prepareStatement(sqlInsert);

        /*
         se valor de venda e custo for igual não faz o insert. Evita vários inserts de produtos com valores iguais
         */
        if (vendaAtual != produto.getvAtual() && custoAtual != produto.getvAtual()) {
            stm.setString(1, produto.getCodigo());
            stm.setString(2, produto.getDataAlteracao());
            stm.setDouble(3, produto.getvAtual());
            stm.setDouble(4, produto.getcAtual());
            stm.setString(5, produto.getTipo());
            stm.setDouble(6, vendaAtual);
            stm.setDouble(7, custoAtual);

            stm.execute();
        }

        /*
         atualizando tabela produto com os valores do SPAC (pra ficar igual)
         */
        String sql = "UPDATE PRODUTO SET VENDA_ATUAL = ?, CUSTO_ATUAL = ? WHERE CODIGO = ?";
        PreparedStatement stmt = con.prepareStatement(sql);

        stmt.setDouble(1, produto.getvAtual());
        stmt.setDouble(2, produto.getcAtual());
        stmt.setString(3, produto.getCodigo());
        stmt.execute();

        stm.close();
        stmValAnt.close();
        stmt.close();

        con.close();
    }

    public static List<ProdutoBean> listaProdReajustados(String dataInicial, String dataFinal) throws SQLException {
        List<ProdutoBean> lista = new ArrayList<>();

        Connection con = ConexaoMySql.getConection();

        String sql = "SELECT DISTINCT P.CODIGO, P.DESCRICAO, DATE_FORMAT(A.DATA_ALTERACAO,'%d/%m/%Y') AS DATA_ALTERACAO, A.CUSTO_ANTERIOR, A.NOVO_CUSTO,"
                + "ROUND(((A.NOVO_CUSTO*100)/A.CUSTO_ANTERIOR)-100,2) AS REAJ_CUSTO, A.VENDA_ANTERIOR, A.NOVO_VENDA, ROUND(((A.NOVO_VENDA*100)/A.VENDA_ANTERIOR)-100,2) AS REAJ_VENDA, A.TIPO "
                + "FROM produto P, alteracao A "
                + "WHERE A.CODIGO = P.CODIGO "
                + "AND A.DATA_ALTERACAO BETWEEN '" + dataInicial + "' AND '" + dataFinal + "' "
                + "ORDER BY A.DATA_ALTERACAO DESC, P.DESCRICAO";

        PreparedStatement stm = con.prepareStatement(sql);
        ResultSet rs = stm.executeQuery();

        while (rs.next()) {
            ProdutoBean produto = new ProdutoBean();

            produto.setDataAlteracao(rs.getString("DATA_ALTERACAO"));
            produto.setCodigo(rs.getString("CODIGO"));
            produto.setDescricao(rs.getString("DESCRICAO"));
            produto.setcAnterior(rs.getDouble("CUSTO_ANTERIOR"));
            produto.setcAtual(rs.getDouble("NOVO_CUSTO"));
            produto.setReajusteCusto(rs.getDouble("REAJ_CUSTO"));
            produto.setvAnterior(rs.getDouble("VENDA_ANTERIOR"));
            produto.setvAtual(rs.getDouble("NOVO_VENDA"));
            produto.setReajusteVenda(rs.getDouble("REAJ_VENDA"));
            produto.setTipo(rs.getString("TIPO"));

            lista.add(produto);

        }

        stm.close();
        con.close();
        return lista;
    }

    /*
     lista com codigo e descricao dos produtos para atualizar no mysql
     */
    public static List<ProdutoBean> listaAtualizarDescProdutos() throws SQLException, IOException {
        List<ProdutoBean> lista = new ArrayList<>();

        Connection con = ConexaoADS.getConection();

        String sql = "SELECT C01CODIGO, C01DESC, C01UNIDADE, C01FLAG, C01PRCCUS, C01PRCVDA FROM SPAC01";

        PreparedStatement stm = con.prepareStatement(sql);
        ResultSet rs = stm.executeQuery();

        while (rs.next()) {
            ProdutoBean produto = new ProdutoBean();

            produto.setCodigo(rs.getString("C01CODIGO"));
            produto.setDescricao(rs.getString("C01DESC"));
            produto.setUn(rs.getString("C01UNIDADE"));
            produto.setSituacao(rs.getString("C01FLAG"));
            produto.setpCusto(rs.getDouble("C01PRCCUS"));
            produto.setpVenda(rs.getDouble("C01PRCVDA"));

            lista.add(produto);

        }

        stm.close();
        con.close();
        return lista;
    }

    /*
     atualizando descricao dos produtos no mysql
     */
    public static void atualizaDescProdutos(List<ProdutoBean> listaProdutos) throws SQLException {
        Connection con = ConexaoMySql.getConection();

        String sql = "UPDATE produto p set p.descricao = ?, p.unidade = ?, p.situacao = ?, p.preco_custo = ?, p.preco_venda = ? WHERE p.CODIGO = ?";

        PreparedStatement stmt = con.prepareStatement(sql);

        for (ProdutoBean lProduto : listaProdutos) {

            stmt.setString(1, lProduto.getDescricao().replace("�", " "));
            stmt.setString(2, lProduto.getUn());
            stmt.setString(3, lProduto.getSituacao());
            stmt.setDouble(4, lProduto.getpCusto());
            stmt.setDouble(5, lProduto.getpVenda());
            stmt.setInt(6, Integer.parseInt(lProduto.getCodigo()));

            stmt.execute();
        }

        con.close();
        stmt.close();
    }

    /*
     fim analise de reajustes
     */
}
